home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / generic2text4.e < prev    next >
Text File  |  2002-03-12  |  4KB  |  196 lines

  1. /*
  2.    Generic2Text
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT REG=5
  10.  
  11. LIBRARY 'generic2text.plugin',1,1,'Generic2Text 1.02' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
  12.  
  13. MODULE 'tools/ctype', '*epo'
  14.  
  15. DEF memadr:PTR TO CHAR, mem2:PTR TO CHAR, lenadr, len2
  16.  
  17.  
  18. PROC em_isdatatype(memadr, l)
  19.    DEF c = 0, loop = TRUE, isgen = FALSE
  20.    DEF end
  21.  
  22.    -> FIRST AND LAST BYTES FOR BINARY CHARS
  23.  
  24.    c   := 0
  25.    end := Min(8, l)
  26.    WHILE loop AND (c < end)
  27.      SELECT 256 OF memadr[c]
  28.        CASE "\t", "\e"
  29.          INC c
  30.        CASE " " TO $7e
  31.          INC c
  32.        CASE "\n", "\b"
  33.          INC c
  34.        DEFAULT
  35.          isgen := TRUE
  36.          loop := FALSE
  37.        ENDSELECT
  38.    ENDWHILE
  39.  
  40.    IF isgen = FALSE
  41.      c   := Max(0, l - 8)
  42.      end := l
  43.      WHILE loop AND (c < end)
  44.        SELECT 256 OF memadr[c]
  45.          CASE "\t", "\e"
  46.            INC c
  47.          CASE " " TO $7e
  48.            INC c
  49.          CASE "\n", "\b"
  50.            INC c
  51.          DEFAULT
  52.            isgen := TRUE
  53.            loop := FALSE
  54.          ENDSELECT
  55.      ENDWHILE
  56.    ENDIF
  57. ENDPROC isgen
  58.  
  59.  
  60. PROC em_parsedata(epo:PTR TO em_pluginobj)
  61.   DEF count = 0, count2 = 0
  62.   DEF loop = TRUE
  63.   DEF a
  64.  
  65.   ->mem2 := memadr
  66.  
  67.   memadr := epo.buffer
  68.   lenadr := epo.length
  69.  
  70.   mem2 := epo.nbuffer
  71.  
  72.    -> SKIP UNTIL WE GOT SOME TEXT
  73.  
  74.    WHILE (count < lenadr)
  75.      EXIT (memadr[count] = "\n") OR (memadr[count] = "\b")
  76.      INC count
  77.    ENDWHILE
  78.  
  79.    WHILE loop AND (count < lenadr)
  80.      SELECT 256 OF memadr[count]
  81.        CASE "\b", "\n"
  82.          -> FIND START OF LINE
  83.          a := count
  84.          WHILE ((memadr[a-1] >= " ") AND (memadr[a-1] <= $7e) AND (a > 0)) DO DEC a
  85.  
  86.          -> IF ITS NOT A STRAY LF/CR
  87.          IF (a < count) OR ((memadr[a-1] = "\n") OR (memadr[a-1] = "\b"))
  88.        ->    DEC count
  89.            count2 := copyline(memadr, a, count -1, mem2, count2)
  90.            loop := FALSE
  91.          ENDIF
  92.      ENDSELECT
  93.      IF loop THEN INC count
  94.    ENDWHILE
  95.    loop := TRUE
  96.  
  97.  
  98.    WHILE (count < lenadr)
  99.      SELECT 256 OF memadr[count]
  100.        CASE "\b", "\n"
  101.          -> FIND START OF LINE
  102.          a := count
  103.          WHILE (((memadr[a+1] >= " ") AND (memadr[a+1] <= $7e) OR (memadr[a+1] = "\t")) AND (a < lenadr)) DO INC a
  104.  
  105.  
  106.          -> IF ITS NOT A STRAY LF/CR
  107.          IF (a > count) OR ((memadr[a+1] = "\n") OR (memadr[a+1] = "\b"))-> OR (memadr[a+1] = "\t"))
  108.            count2 := copyline(memadr, count, a, mem2, count2)
  109.          ENDIF
  110.          count := a
  111.      ENDSELECT
  112.      INC count
  113.    ENDWHILE
  114.  
  115.   mem2[count2] := "\n"
  116.  
  117. ENDPROC mem2, count2
  118. -><
  119.  
  120. PROC copyline(mem:PTR TO CHAR, pos, end, m2:PTR TO CHAR, pos2)
  121. ->  DEF loop = TRUE
  122.   DEF currchar = 0, oldcc, oldpos, wordwrap = 80
  123.  
  124.   WHILE (pos <= end)
  125.  
  126.     SELECT 256 OF mem[pos]
  127.       CASE "\n", "\b", "\t"
  128.         m2[pos2++] := mem[pos++]
  129.         currchar := 0
  130.  
  131.       CASE " " TO $7e
  132.         m2[pos2] := mem[pos++]
  133.         INC currchar
  134.  
  135.  
  136.         IF FALSE ->IF ww = TRUE
  137.           IF currchar >= wordwrap
  138.  
  139.           -> Find last space
  140.  
  141.             IF isspace(m2[pos2]) = TRUE
  142.               m2[pos2++] := "\n"
  143.               currchar := 0
  144.             ELSE
  145.               oldpos := pos2
  146.               oldcc  := currchar
  147.               WHILE isspace(m2[pos2]) = FALSE
  148.                 m2[pos2 + 1] := m2[pos2]
  149.                 DEC pos2
  150.                 DEC currchar
  151.               ENDWHILE
  152.  
  153.               INC pos2
  154.               m2[pos2] := "\n"
  155.               currchar := oldcc - currchar
  156.  
  157.               pos2 := oldpos + 1
  158.             ENDIF
  159.           ENDIF
  160.         ENDIF
  161.  
  162.         INC pos2
  163.     ENDSELECT
  164.  
  165.     EXIT (pos > end)
  166.   ENDWHILE
  167. ENDPROC pos2
  168.  
  169. -> *** STANDARD PROCS FOR PLUGINS
  170.  
  171. PROC em_main(epo:PTR TO em_pluginobj)
  172.     mem2, len2  := em_parsedata(epo)
  173. ->    epo.buffer  := mem2
  174. ->    epo.length  := len2
  175.     epo.nlength := len2
  176.     RETURN TRUE
  177. ENDPROC
  178.  
  179. PROC em_begin(epo:PTR TO em_pluginobj)
  180.   IF em_isdatatype(epo.buffer, epo.length)
  181.     RETURN "MEM", (epo.length * 2)
  182.   ELSE
  183.     RETURN FALSE
  184.   ENDIF
  185. ENDPROC
  186.  
  187. PROC em_end()      IS EMPTY
  188.  
  189. PROC em_info()     IS 'Generic2Text 1.02'
  190.  
  191. PROC em_pluginid() IS "FILE"
  192.  
  193. PROC em_format()   IS 'Generic'
  194.  
  195. PROC main()        IS EMPTY
  196.